AWS WAFv2をCDKで構築してみた
CX事業部の太田です。
AWS
初心者ですが、CDK
を使ってWAFv2
を作りましたので紹介いたします。
WAFの構築
まずは、@aws-cdk/aws-wafv2
をインストールします。
npm install --save @aws-cdk/aws-wafv2
あとは、@aws-cdk/aws-wafv2.CfnWebACL
を使って実装します。
CDKを使ったWAFv2のソースは以下です。
import * as cdk from "@aws-cdk/core"; import * as wafv2 from "@aws-cdk/aws-wafv2"; export class SampleWafStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // WebACLを作成 const webAcl = new wafv2.CfnWebACL(this, "SampleWafAcl", { defaultAction: { allow: {} }, name: "sample-waf-web-acl", rules: [ { priority: 1, overrideAction: { none: {} }, visibilityConfig: { sampledRequestsEnabled: true, cloudWatchMetricsEnabled: true, metricName: "AWS-AWSManagedRulesSQLiRuleSet" }, name: "AWS-AWSManagedRulesSQLiRuleSet", statement: { managedRuleGroupStatement: { vendorName: "AWS", name: "AWSManagedRulesSQLiRuleSet" } } } ], scope: "REGIONAL", visibilityConfig: { cloudWatchMetricsEnabled: true, metricName: "sample-waf-web-acl", sampledRequestsEnabled: true } }); } }
指定するパラメーターの詳細は以下のページで確認できます。
AWS::WAFv2::WebACL
AWS::WAFv2::WebACL Rule
WS::WAFv2::WebACL ManagedRuleGroupStatement
あとは、ビルドしてデプロイすればOK
$ npm run build $ cdk deploy SampleWafStack: deploying... SampleWafStack: creating CloudFormation changeset... 0/3 | 2:45:13 PM | CREATE_IN_PROGRESS | AWS::WAFv2::WebACL | SampleWafAcl 0/3 | 2:45:13 PM | CREATE_IN_PROGRESS | AWS::CDK::Metadata | CDKMetadata 0/3 | 2:45:15 PM | CREATE_IN_PROGRESS | AWS::WAFv2::WebACL | SampleWafAcl Resource creation Initiated 0/3 | 2:45:15 PM | CREATE_IN_PROGRESS | AWS::CDK::Metadata | CDKMetadata Resource creation Initiated 1/3 | 2:45:15 PM | CREATE_COMPLETE | AWS::CDK::Metadata | CDKMetadata 2/3 | 2:45:15 PM | CREATE_COMPLETE | AWS::WAFv2::WebACL | SampleWafAcl 3/3 | 2:45:17 PM | CREATE_COMPLETE | AWS::CloudFormation::Stack | SampleWafStack ✅ SampleWafStack Stack ARN: arn:aws:cloudformation:ap-northeast-1:123456789012:stack/SampleWafStack/12345678-1234-1234-1234-123456789012
AWSコンソールを見ると、WebACLができてました。
対応時にハマったところがあったので紹介します。
overrideAction
AWS::WAFv2::WebACL Ruleには、ルールに一致した場合の動作を決めるaction
とoverrideAction
という2つのプロパティがあり、どちらかを指定する必要があります。
指定するルールに合わせて指定する必要があり、今回はmanagedRuleGroupStatement
を使用しているのでoverrideAction
を指定する必要があるのですが、最初はそれに気づかずaction
を指定してしまってデプロイができませんでした。
どちらを指定するかはAWS::WAFv2::WebACL Ruleに記載されているので、単純に私の英語力の問題でしたが・・
vendorNameとname
WS::WAFv2::WebACL ManagedRuleGroupStatementには、適用するマネージドルールを特定するためにvendorName
とname
を指定する必要があります。
AWSで提供されているマネージドルールはここを見るとわかるのですが、AWS Marketplace
で購入したものを使いたい場合に少し悩みました。
利用可能なマネージドルールはAWS CLI
で取得できるので、あとは使いたいルールのvendorName
とname
を利用すればOKです。
$ aws wafv2 list-available-managed-rule-groups --scope REGIONAL { "ManagedRuleGroups": [ { "Description": "Contains rules that allow you to block request patterns associated with exploitation of SQL databases, like SQL injection attacks. This can help prevent remote injection of unauthorized queries.", "VendorName": "AWS", "Name": "AWSManagedRulesSQLiRuleSet" }, ... 省略 ] }
関連付け
WAFv2
はALB
やAPI Gateway
、CloudFront
と関連付けて使うことになりますが、wafv2.CfnWebACL
には設定するプロパティ等が用意されておらず出来ませんでした。
なので、今回はAWS CLI
を使って関連付けを行いました。
aws wafv2 associate-web-acl \ --web-acl-arn <WAFv2のARN> \ --resource-arn <関連付けたいリソースのARN>
最後に
AWS
を初めてまともに触りましたが、個人的にはコンソール上で操作するよるよりはCDK
で構築できるのは敷居が下がった気がしました。
WAFv2
もまだパブリックベータなので、今後のアップデートなどで関連付の部分などが便利になったりするといいなと思いました。
最後までご覧いただきありがとうございました。